#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>


int main(int argc, char const *argv[]) // ./a.out file1 file2
{
    if(argc != 3)
    {
        printf("请指定源码文件、目标文件\n");
        exit(0);
    }

    // 标准IO打开文件的六中模式
    // fopen(argv[1], "r"); // 只读
    // fopen(argv[1], "w"); // 只写
    // fopen(argv[1], "a"); // 只写且追加
    // fopen(argv[1], "r+");// 读写，文件必须存在否则报错
    // fopen(argv[1], "w+");// 读写，文件若不存在则新建，若存在则清空
    // fopen(argv[1], "a+");// 读写，文件若不存在则新建，若存在则追加写入

    // 1. 以正确的模式打开源文件、目标文件
    FILE *fp1 = fopen(argv[1], "r"); // 只读
    FILE *fp2 = fopen(argv[2], "w"); // 只写
    if(fp1 == NULL || fp2 == NULL)
    {
        printf("打开文件失败：%s\n", strerror(errno));
        exit(0);
    }

    // 2. 不断读取源文件，写入目标文件
    // 2.1 按字节读写
    while(1)
    {
        int ch = fgetc(fp1);

        if(ch == EOF)
        {
            // A. 遇到错误
            if(ferror(fp1))
            {
                perror("读取源文件失败");
                exit(0);
            }

            // B. 已经读完了
            if(feof(fp1))
            {
                printf("文件拷贝完成！\n");
                break;
            }
        }

        fputc(ch, fp2);
    }


    // 3. 释放相关资源
    fclose(fp1);
    fclose(fp2);

    return 0;
}
